package com.zbj;

import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * BeanFactoryApplication
 *
 * @author weigang
 * @create 2019-07-30
 **/
@SpringBootApplication
public class BeanFactoryApplication {
    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(BeanFactoryApplication.class);
        // 添加监听器方式一
        // 方式二 CustomApplicationListener 类上加 @Component
        // 方式三 单独配置Bean 在ListenerConfig类中
        springApplication.addListeners(new CustomApplicationListener());
        // 获取 ApplicationContext 方式一
        // 这种方式有缺点 必须要等所有Bean初始化完成才能返回 ApplicationContext
        // 如果在当前类或方法完成bean注册 违背单一原则
        // 网上部分网友使用静态类，完成初始化后设置到静态类中，使用时直接得到ApplicationContext进行操作 类似于 ApplicationContextUtils
        // 静态方法是全局的 所有方法都可以修改 存在安全风险
        ConfigurableApplicationContext applicationContext = springApplication.run(args);
        DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext.getBeanFactory();

        Order order = new Order("sdqeadse213", "asfas", "浙江省杭州市");
        beanFactory.registerSingleton("order", order);
    }
}